package com.bluebridgecup.BasicAlgorithms.oneDimensionPrefixSumAndDifference;

import java.util.ArrayList;
import java.util.Scanner;

// 该类用于寻找类斐波那契循环数
// 具体功能是在一定范围内找出符合特定类斐波那契数列循环规则的最大数
public class FibCycleFinder {
    public static void main(String[] args) {
        // 创建Scanner对象，用于从控制台读取输入，虽然在此处未实际使用输入功能
        Scanner scanner = new Scanner(System.in);
        // 用于存储找到的最大类斐波那契循环数，初始值设为0
        long an = 0;
        // 从197开始到小于10^7（10000000）的数进行遍历
        for (int i = 197; i < 1e7; i++) {
            // 调用pd方法判断当前数字i是否为类斐波那契循环数
            // 如果是，则更新an为当前的i
            if (pd(i)) {
                an = i;
            }
        }
        // 输出找到的最大类斐波那契循环数
        System.out.println(an);
    }

    // 私有静态方法，用于判断一个整数是否为类斐波那契循环数
    private static boolean pd(int i) {
        // 创建一个ArrayList对象ans，用于存储根据整数i生成的类斐波那契数列的元素
        ArrayList<Integer> ans = new ArrayList<>();
        // 将整数i转换为字符串s，方便逐个获取i的各个数位上的数字
        String s = "" + i;
        // 用于记录当前生成的类斐波那契数列元素的总和，初始值为0
        int anss = 0;
        // 遍历字符串s，将每个字符转换为对应的数字（通过减去字符'0'的ASCII值实现）
        // 并将其添加到ans列表中，同时累加到anss中
        for (int j = 0; j < s.length(); j++) {
            ans.add(s.charAt(j) - '0');
            anss = anss + s.charAt(j) - '0';
        }
        // 将数位数字的总和anss添加到ans列表中
        ans.add(anss);
        // 进入无限循环，不断生成类斐波那契数列的后续元素并进行判断
        while (true) {
            // 根据类斐波那契数列的生成规则，计算下一个数列元素
            // 规则为当前总和的两倍减去列表中第一个元素，得到新的总和
            anss = (anss * 2) - ans.get(0);
            // 移除列表中的第一个元素，因为已使用它参与新元素的计算，后续不再需要
            ans.remove(0);
            // 将新生成的元素添加到列表末尾，以维护类斐波那契数列
            ans.add(anss);
            // 如果新生成的元素值等于原始整数i，说明i是类斐波那契循环数，返回true
            if (anss == i) {
                return true;
            }
            // 如果新生成的元素值大于原始整数i，说明在当前生成逻辑下，i不会再出现在数列中
            // 即i不是类斐波那契循环数，返回false
            else if (anss > i) {
                return false;
            }
        }
    }
}